﻿#ifndef GOODIX_ALGO_BT_H
#define GOODIX_ALGO_BT_H
#include <stdint.h>        
#include "goodix_algo.h"
#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus */

#if _WIN32 || _WIN64
#define DLL_API_BODY_TEMPERATURE extern _declspec(dllexport)
#else
#define DLL_API_BODY_TEMPERATURE
#endif

/* **************************************const value define*********************************************** */


/* **************************************funcs define*********************************************** */

/* **************************************enum define*********************************************** */

/**
 * @brief BT Errorcode enum
*/
typedef enum
{
    EM_BT_ERRORCODE_OK = 0,                     //错误码：成功
    EM_BT_ERRORCODE_PRE_INIT_FAIL = 1,          //错误码：预处理初始化失败
    EM_BT_ERRORCODE_PRE_NULL_PTR,               //错误码：预处理指针为空
    EM_BT_ERRORCODE_PRE_MALLOC_FAIL,            //错误码：预处理内存申请失败
    EM_BT_ERRORCODE_PRE_INVALID_VALUE,          //错误码：预处理非法参数
    EM_BT_ERRORCODE_PRE_FAIL,                   //错误码：预处理失败
    EM_BT_ERRORCODE_ALGO_INIT_FAIL,             //错误码：算法初始化失败
    EM_BT_ERRORCODE_ALGO_UN_INIT,               //错误码：算法未初始化
    EM_BT_ERRORCODE_ALGO_DEINIT_FAIL,           //错误码：算法销毁失败
    EM_BT_ERRORCODE_ALGO_NULL_PTR,              //错误码：算法处理空指针
    EM_BT_ERRORCODE_ALGO_INVALID_VALUE,         //错误码：算法处理非法参数
    EM_BT_ERRORCODE_ALGO_MALLOC_FAIL,           //错误码：算法处理申请内存失败
    EM_BT_ERRORCODE_ALGO_FAIL,                  //错误码：算法处理失败
    EM_BT_ERRORCODE_MAX,
}EM_BT_ERRORCODE;

/**
 * @brief BT device type enum
*/
typedef enum
{
    EM_BT_DEVICE_WATCH_SINGLE = 0,              //设备类型：单Sensor手表
    EM_BT_DEVICE_WATCH_DOUBLE,                  //设备类型：双Sensor手表
    EM_BT_DEVICE_BAND_SINGLE,                   //设备类型：单Sensor手表
    EM_BT_DEVICE_BAND_DOUBLE,                   //设备类型：双Sensor手环
    EM_BT_DEVICE_INEAR,                         //设备类型：入耳式耳机
    EM_BT_DEVICE_TYPE_MAX,
}EM_BT_DEVICE_TYPE;

/**
 * @brief BT monitor mode
*/
typedef enum
{
    EM_MONITOR_ONCE = 0,                       //测试模式：单次点测
    EM_MONITOR_CONTINUE,                       //测试模式：连续监测
    EM_MONITOR_TEST,                           //测试模式：测试模式
    EM_MONITOR_MAX,                            
}EM_BT_MONITOR_MODE;

/* **************************************struct define*********************************************** */

/**
 * @brief BT sensor information struct
*/
typedef  struct
{
    int32_t* pnResistance;     //RT表R值
    int8_t* pnTemperature;     //RT表T值
    char chRTNum;              //RT表总校准点个数
    char chChannelNum;         //Sensor数量
    int32_t nCaliResistance;   //精密阻值
    int8_t nTemperatureMax;    //测温上限
    int8_t nTemperatureMin;    //测温下限
    char chResFlag;            //数据是否为阻值 0-否 1-是
}ST_BT_SENSOR_INFO;

/**
 * @brief BT personal information struct
*/
typedef struct
{
    uint8_t unAge;             //年龄，单位岁
    uint8_t unHeight;          //身高，单位cm
    uint8_t unWeight;          //体重，单位kg
    uint8_t unReserves[10];    //预留
}ST_BT_PERSONAL_INFO;

/**
 * @brief BT physical signs struct
*/
typedef struct
{
    uint16_t unHr;             //心率，单位pulse/min
    uint16_t unMotionFlag;     //运动，状态标记
    uint16_t unReserves[3];    //预留
}ST_BT_PHYSICAL_SIGNS;

/* **************************************struct which Algorithm Functions need to use define*********************************************** */

/**
 * @brief 初始化结构体
*/
typedef struct
{
/* ini config send section */
    char                 chSampleFre;                 // 采样率
    int32_t*             pnAlConfigInfo;              // 配置信息
    int32_t              nAlConfigInfoLen;            // 配置信息长度

    ST_BT_SENSOR_INFO    stSensorInfo;                // 传感器信息
                                                         
/* application send section */                           
    ST_BT_PERSONAL_INFO  stPersonalInfo;              // 个人信息
    GU32                 unCurTimestamp;              // unix时间戳
    EM_BT_MONITOR_MODE   emMonitorMode;               // 测试模式
    EM_BT_DEVICE_TYPE    emDeviceType;                // 测试设备
/* other section */
                 
}STGoodixAlgorithmBtControlConfigParametersBuffer;

/**
 * @brief 加速度结构体
*/
typedef struct
{
    int16_t  sGSensorX;                             // 加速度计x轴
    int16_t  sGSensorY;                             // 加速度计y轴
    int16_t  sGSensorZ;                             // 加速度计z轴
}STGoodixAlgorithmBtCalculateInputAccdata;

/**
 * @brief 外部输入参考结构体
*/
typedef struct
{
    int32_t              nPpgAutoCorr;              // PPG自相关系数
    int32_t              nCapRes;                   // 电容佩戴检测结果
    ST_BT_PHYSICAL_SIGNS stPhysicalSigns;           // 人体生理指标
}STGoodixAlgorithmBtInputRef;                       
 
/**
 * @brief  各通道中间结果
*/
typedef struct
{
    int32_t nRaw;                                   // 传感器原始输出
    int16_t nRawTemp;                               // 传感器输出温度
    int16_t nSecondTemp;                            // 每秒温度均值
    int16_t nFastoutTemp;                           // 预测结果
    char    chStable;
    char    chQuality;                              // 置信度 
    char    chConfidence;
}ST_BT_CHANNEL_OUT_RESULT;
/**                                                 
 * @brief 中间计算结果输出                          
*/                                                  
typedef struct                                      
{   /* update flag */                                   
    char                      chResultUpdateFlag;   // 结果更新标记
    char                      chSensorNum;          // 传感器数量
    /* Algorithm result */
    ST_BT_CHANNEL_OUT_RESULT* pstChannel;           // 各通道结果
    char    chConfidence;
}STGoodixAlgorithmBtCalculateOutputResult;          
                                                    
/**                                                 
 * @brief 最终出值结构体                            
*/                                                  
typedef struct                                      
{                                                   
/* update flag */                                   
    char                 chResultUpdateFlag;        // 结果更新标记
/* Algorithm result */                                 
    int16_t              nResulttype;               // 输出体温类型    
    int16_t              nBT;                       // 体温        
    char                 chConfidence;              // 置信度
    char                 chAbnormalH;               // 异常体温偏高
    char                 chAbnormalL;               // 异常体温偏低
/* other result */         

}STGoodixAlgorithmBtFinalOutputResult;

/* **************************************other functions define*********************************************** */


/* ******************************************************************************************* */

DLL_API_BODY_TEMPERATURE GU8* GoodixBtAlgoVersion(void);
DLL_API_BODY_TEMPERATURE GS32 GoodixBtAlgoInit(STGoodixAlgorithmInfo* pstGoodixAlgorithmInfo);
DLL_API_BODY_TEMPERATURE GS32 GoodixBtAlgoCalculate(STGoodixAlgorithmInfo* pstGoodixAlgorithmInfo);
//DLL_API_BODY_TEMPERATURE GS32 GoodixBtAlgoFinalCalculate(STGoodixAlgorithmInfo* pstGoodixAlgorithmInfo);
DLL_API_BODY_TEMPERATURE GS32 GoodixBtAlgoDeinit(STGoodixAlgorithmInfo* pstGoodixAlgorithmInfo);

/* ******************************************************************************************* */

#ifdef __cplusplus
}
#endif
#endif //GOODIX_ALGO_BT_H
